/*
Copyright 2012 Igor Vaynberg
 
Version: 3.2 Timestamp: Mon Sep 10 10:38:04 PDT 2012

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
*/
 (function(e) {
    "undefined" == typeof e.fn.each2 && e.fn.extend({
        each2: function(g) {
            for (var i = e([0]), m = -1, s = this.length; ++m < s && (i.context = i[0] = this[m]) && !1 !== g.call(i[0], m, i););
            return this
        }
    })
})(jQuery);
 (function(e, g) {
    function i(a, b) {
        var c = 0,
        d = b.length,
        j;
        if ("undefined" === typeof a) return - 1;
        if (a.constructor === String) for (; c < d; c += 1) {
            if (0 === a.localeCompare(b[c])) return c
        } else for (; c < d; c += 1) if (j = b[c], j.constructor === String) {
            if (0 === j.localeCompare(a)) return c
        } else if (j === a) return c;
        return - 1
    }
    function m(a, b) {
        return a === b ? !0: a === g || b === g || null === a || null === b ? !1: a.constructor === String ? 0 === a.localeCompare(b) : b.constructor === String ? 0 === b.localeCompare(a) : !1
    }
    function s(a, b) {
        var c,
        d,
        j;
        if (null === a || 1 > a.length) return [];
        c = a.split(b);
        d = 0;
        for (j = c.length; d < j; d += 1) c[d] = e.trim(c[d]);
        return c
    }
    function A(a, b, c) {
        var c = c || g,
        d;
        return function() {
            var j = arguments;
            window.clearTimeout(d);
            d = window.setTimeout(function() {
                b.apply(c, j)
            },
            a)
        }
    }
    function l(a) {
        a.preventDefault();
        a.stopPropagation()
    }
    function B(a, b, c) {
        var d = a.toUpperCase().indexOf(b.toUpperCase()),
        b = b.length;
        0 > d ? c.push(a) : (c.push(a.substring(0, d)), c.push("<span class='select2-match'>"), c.push(a.substring(d, d + b)), c.push("</span>"), c.push(a.substring(d + b, a.length)))
    }
    function C(a) {
        var b,
        c = 0,
        d = null,
        j = a.quietMillis || 100;
        return function(h) {
            window.clearTimeout(b);
            b = window.setTimeout(function() {
                var b = c += 1,
                j = a.data,
                n = a.transport || e.ajax,
                f = a.traditional || !1,
                g = a.type || "GET",
                j = j.call(this, h.term, h.page, h.context);
                null !== d && d.abort();
                d = n.call(null, {
                    url: a.url,
                    dataType: a.dataType,
                    data: j,
                    type: g,
                    traditional: f,
                    success: function(d) {
                        b < c || (d = a.results(d, h.page), h.callback(d))
                    }
                })
            },
            j)
        }
    }
    function D(a) {
        var b = a,
        c,
        d = function(a) {
            return "" + a.text
        };
        e.isArray(b) || (d = b.text, e.isFunction(d) || (c = b.text, d = function(a) {
            return a[c]
        }), 
        b = b.results);
        return function(a) {
            var c = a.term,
            f = {
                results: []
            },
            k;
            if (c === "") a.callback({
                results: b
            });
            else {
                k = function(b, f) {
                    var g,
                    t,
                    b = b[0];
                    if (b.children) {
                        g = {};
                        for (t in b) b.hasOwnProperty(t) && (g[t] = b[t]);
                        g.children = [];
                        e(b.children).each2(function(a, b) {
                            k(b, g.children)
                        });
                        g.children.length && f.push(g)
                    } else a.matcher(c, d(b)) && f.push(b)
                };
                e(b).each2(function(a, b) {
                    k(b, f.results)
                });
                a.callback(f)
            }
        }
    }
    function E(a) {
        return e.isFunction(a) ? a: function(b) {
            var c = b.term,
            d = {
                results: []
            };
            e(a).each(function() {
                var a = this.text !== 
                g,
                e = a ? this.text: this;
                if ("" === c || b.matcher(c, e)) d.results.push(a ? this: {
                    id: this,
                    text: this
                })
            });
            b.callback(d)
        }
    }
    function u(a) {
        if (e.isFunction(a)) return ! 0;
        if (!a) return ! 1;
        throw Error("formatterName must be a function or a falsy value");
    }
    function v(a) {
        return e.isFunction(a) ? a() : a
    }
    function F(a) {
        var b = 0;
        e.each(a, 
        function(a, d) {
            d.children ? b += F(d.children) : b++
        });
        return b
    }
    function H(a, b, c, d) {
        var e = a,
        h = !1,
        f,
        k,
        n,
        o;
        if (!d.createSearchChoice || !d.tokenSeparators || 1 > d.tokenSeparators.length) return g;
        for (;;) {
            h = -1;
            k = 0;
            for (n = d.tokenSeparators.length; k < n && !(o = d.tokenSeparators[k], h = a.indexOf(o), 0 <= h); k++);
            if (0 > h) break;
            f = a.substring(0, h);
            a = a.substring(h + o.length);
            if (0 < f.length && (f = d.createSearchChoice(f, b), f !== g && null !== f && d.id(f) !== g && null !== d.id(f))) {
                h = !1;
                k = 0;
                for (n = b.length; k < n; k++) if (m(d.id(f), d.id(b[k]))) {
                    h = !0;
                    break
                }
                h || c(f)
            }
        }
        if (0 != e.localeCompare(a)) return a
    }
    function x(a, b) {
        var c = function() {};
        c.prototype = new a;
        c.prototype.constructor = c;
        c.prototype.parent = a.prototype;
        c.prototype = e.extend(c.prototype, b);
        return c
    }
    if (window.Select2 === g) {
        var f,
        w,
        y,
        z,
        G,
        q;
        f = {
            TAB: 9,
            ENTER: 13,
            ESC: 27,
            SPACE: 32,
            LEFT: 37,
            UP: 38,
            RIGHT: 39,
            DOWN: 40,
            SHIFT: 16,
            CTRL: 17,
            ALT: 18,
            PAGE_UP: 33,
            PAGE_DOWN: 34,
            HOME: 36,
            END: 35,
            BACKSPACE: 8,
            DELETE: 46,
            isArrow: function(a) {
                a = a.which ? a.which: a;
                switch (a) {
                case f.LEFT:
                case f.RIGHT:
                case f.UP:
                case f.DOWN:
                    return ! 0
                }
                return ! 1
            },
            isControl: function(a) {
                switch (a.which) {
                case f.SHIFT:
                case f.CTRL:
                case f.ALT:
                    return ! 0
                }
                return a.metaKey ? !0: !1
            },
            isFunctionKey: function(a) {
                a = a.which ? a.which: a;
                return 112 <= a && 123 >= a
            }
        };
        var I = 1;
        G = function() {
            return I++
        };
        e(document).delegate("body", "mousemove", 
        function(a) {
            e.data(document, "select2-lastpos", {
                x: a.pageX,
                y: a.pageY
            })
        });
        e(document).ready(function() {
            e(document).delegate("body", "mousedown touchend", 
            function(a) {
                var b = e(a.target).closest("div.select2-container").get(0),
                c;
                b ? e(document).find("div.select2-container-active").each(function() {
                    this !== b && e(this).data("select2").blur()
                }) : (b = e(a.target).closest("div.select2-drop").get(0), e(document).find("div.select2-drop-active").each(function() {
                    this !== b && e(this).data("select2").blur()
                }));
                b = e(a.target);
                c = b.attr("for");
                "LABEL" === a.target.tagName && (c && 0 < c.length) && (b = e("#" + c), b = b.data("select2"), b !== g && (b.focus(), a.preventDefault()))
            })
        });
        w = x(Object, {
            bind: function(a) {
                var b = this;
                return function() {
                    a.apply(b, arguments)
                }
            },
            init: function(a) {
                var b,
                c;
                this.opts = a = this.prepareOpts(a);
                this.id = a.id;
                a.element.data("select2") !== g && null !== a.element.data("select2") && this.destroy();
                this.enabled = !0;
                this.container = this.createContainer();
                this.containerId = "s2id_" + (a.element.attr("id") || "autogen" + G());
                this.containerSelector = 
                "#" + this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, "\\$1");
                this.container.attr("id", this.containerId);
                var d = !1,
                j;
                this.body = function() { ! 1 === d && (j = a.element.closest("body"), d = !0);
                    return j
                };
                a.element.attr("class") !== g && this.container.addClass(a.element.attr("class").replace(/validate\[[\S ]+] ?/, ""));
                this.container.css(v(a.containerCss));
                this.container.addClass(v(a.containerCssClass));
                this.opts.element.data("select2", this).hide().before(this.container);
                this.container.data("select2", 
                this);
                this.dropdown = this.container.find(".select2-drop");
                this.dropdown.addClass(v(a.dropdownCssClass));
                this.dropdown.data("select2", this);
                this.results = b = this.container.find(".select2-results");
                this.search = c = this.container.find("input.select2-input");
                c.attr("tabIndex", this.opts.element.attr("tabIndex"));
                this.resultsPage = 0;
                this.context = null;
                this.initContainer();
                this.initContainerWidth();
                this.results.bind("mousemove", 
                function(a) {
                    var b = e.data(document, "select2-lastpos"); (b === g || b.x !== a.pageX || b.y !== a.pageY) && 
                    e(a.target).trigger("mousemove-filtered", a)
                });
                this.dropdown.delegate(".select2-results", "mousemove-filtered", this.bind(this.highlightUnderEvent));
                var h = this.results,
                f = A(80, 
                function(a) {
                    h.trigger("scroll-debounced", a)
                });
                h.bind("scroll", 
                function(a) {
                    0 <= i(a.target, h.get()) && f(a)
                });
                this.dropdown.delegate(".select2-results", "scroll-debounced", this.bind(this.loadMoreIfNeeded));
                e.fn.mousewheel && b.mousewheel(function(a, c, d, e) {
                    c = b.scrollTop();
                    0 < e && 0 >= c - e ? (b.scrollTop(0), l(a)) : 0 > e && b.get(0).scrollHeight - b.scrollTop() + 
                    e <= b.height() && (b.scrollTop(b.get(0).scrollHeight - b.height()), l(a))
                });
                c.bind("keydown", 
                function() {
                    e.data(c, "keyup-change-value") === g && e.data(c, "keyup-change-value", c.val())
                });
                c.bind("keyup", 
                function() {
                    var a = e.data(c, "keyup-change-value");
                    a !== g && c.val() !== a && (e.removeData(c, "keyup-change-value"), c.trigger("keyup-change"))
                });
                c.bind("keyup-change", this.bind(this.updateResults));
                c.bind("focus", 
                function() {
                    c.addClass("select2-focused");
                    " " === c.val() && c.val("")
                });
                c.bind("blur", 
                function() {
                    c.removeClass("select2-focused")
                });
                this.dropdown.delegate(".select2-results", "mouseup", this.bind(function(a) {
                    0 < e(a.target).closest(".select2-result-selectable:not(.select2-disabled)").length ? (this.highlightUnderEvent(a), this.selectHighlighted(a)) : this.focusSearch();
                    l(a)
                }));
                this.dropdown.bind("click mouseup mousedown", 
                function(a) {
                    a.stopPropagation()
                });
                e.isFunction(this.opts.initSelection) && (this.initSelection(), this.monitorSource()); (a.element.is(":disabled") || a.element.is("[readonly='readonly']")) && this.disable()
            },
            destroy: function() {
                var a = 
                this.opts.element.data("select2");
                a !== g && (a.container.remove(), a.dropdown.remove(), a.opts.element.removeData("select2").unbind(".select2").show())
            },
            prepareOpts: function(a) {
                var b,
                c,
                d;
                b = a.element;
                "select" === b.get(0).tagName.toLowerCase() && (this.select = c = a.element);
                c && e.each("id multiple ajax query createSearchChoice initSelection data tags".split(" "), 
                function() {
                    if (this in a) throw Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
                });
                a = e.extend({},
                {
                    populateResults: function(b, 
                    c, d) {
                        var f,
                        n = this.opts.id,
                        o = this;
                        f = function(b, c, j) {
                            var h,
                            l,
                            i,
                            m,
                            r,
                            p,
                            q;
                            h = 0;
                            for (l = b.length; h < l; h = h + 1) {
                                i = b[h];
                                m = n(i) !== g;
                                r = i.children && i.children.length > 0;
                                p = e("<li></li>");
                                p.addClass("select2-results-dept-" + j);
                                p.addClass("select2-result");
                                p.addClass(m ? "select2-result-selectable": "select2-result-unselectable");
                                r && p.addClass("select2-result-with-children");
                                p.addClass(o.opts.formatResultCssClass(i));
                                m = e("<div></div>");
                                m.addClass("select2-result-label");
                                q = a.formatResult(i, m, d);
                                q !== g && m.html(o.opts.escapeMarkup(q));
                                p.append(m);
                                if (r) {
                                    r = e("<ul></ul>");
                                    r.addClass("select2-result-sub");
                                    f(i.children, r, j + 1);
                                    p.append(r)
                                }
                                p.data("select2-data", i);
                                c.append(p)
                            }
                        };
                        f(c, b, 0)
                    }
                },
                e.fn.select2.defaults, a);
                "function" !== typeof a.id && (d = a.id, a.id = function(a) {
                    return a[d]
                });
                if (c) a.query = this.bind(function(a) {
                    var c = {
                        results: [],
                        more: false
                    },
                    d = a.term,
                    f,
                    n,
                    o;
                    o = function(b, c) {
                        var e;
                        if (b.is("option")) a.matcher(d, b.text(), b) && c.push({
                            id: b.attr("value"),
                            text: b.text(),
                            element: b.get(),
                            css: b.attr("class")
                        });
                        else if (b.is("optgroup")) {
                            e = {
                                text: b.attr("label"),
                                children: [],
                                element: b.get(),
                                css: b.attr("class")
                            };
                            b.children().each2(function(a, b) {
                                o(b, e.children)
                            });
                            e.children.length > 0 && c.push(e)
                        }
                    };
                    f = b.children();
                    if (this.getPlaceholder() !== g && f.length > 0) {
                        n = f[0];
                        e(n).text() === "" && (f = f.not(n))
                    }
                    f.each2(function(a, b) {
                        o(b, c.results)
                    });
                    a.callback(c)
                }),
                a.id = function(a) {
                    return a.id
                },
                a.formatResultCssClass = function(a) {
                    return a.css
                };
                else if (! ("query" in a)) if ("ajax" in a) {
                    if ((c = a.element.data("ajax-url")) && 0 < c.length) a.ajax.url = c;
                    a.query = C(a.ajax)
                } else "data" in a ? a.query = D(a.data) : 
                "tags" in a && (a.query = E(a.tags), a.createSearchChoice = function(a) {
                    return {
                        id: a,
                        text: a
                    }
                },
                a.initSelection = function(b, c) {
                    var d = [];
                    e(s(b.val(), a.separator)).each(function() {
                        var b = this,
                        c = this,
                        j = a.tags;
                        e.isFunction(j) && (j = j());
                        e(j).each(function() {
                            if (m(this.id, b)) {
                                c = this.text;
                                return false
                            }
                        });
                        d.push({
                            id: b,
                            text: c
                        })
                    });
                    c(d)
                });
                if ("function" !== typeof a.query) throw "query function not defined for Select2 " + a.element.attr("id");
                return a
            },
            monitorSource: function() {
                this.opts.element.bind("change.select2", this.bind(function() { ! 0 !== 
                    this.opts.element.data("select2-change-triggered") && this.initSelection()
                }))
            },
            triggerChange: function(a) {
                a = a || {};
                a = e.extend({},
                a, {
                    type: "change",
                    val: this.val()
                });
                this.opts.element.data("select2-change-triggered", !0);
                this.opts.element.trigger(a);
                this.opts.element.data("select2-change-triggered", !1);
                this.opts.element.click();
                this.opts.blurOnChange && this.opts.element.blur()
            },
            enable: function() {
                this.enabled || (this.enabled = !0, this.container.removeClass("select2-container-disabled"))
            },
            disable: function() {
                this.enabled && 
                (this.close(), this.enabled = !1, this.container.addClass("select2-container-disabled"))
            },
            opened: function() {
                return this.container.hasClass("select2-dropdown-open")
            },
            positionDropdown: function() {
                var a = this.container.offset(),
                b = this.container.outerHeight(),
                c = this.container.outerWidth(),
                d = this.dropdown.outerHeight(),
                j = e(window).scrollTop() + document.documentElement.clientHeight,
                b = a.top + b,
                f = a.left,
                j = b + d <= j,
                g = a.top - d >= this.body().scrollTop(),
                k = this.dropdown.hasClass("select2-drop-above"),
                n;
                "static" !== this.body().css("position") && 
                (n = this.body().offset(), b -= n.top, f -= n.left);
                k ? (k = !0, !g && j && (k = !1)) : (k = !1, !j && g && (k = !0));
                k ? (b = a.top - d, this.container.addClass("select2-drop-above"), this.dropdown.addClass("select2-drop-above")) : (this.container.removeClass("select2-drop-above"), this.dropdown.removeClass("select2-drop-above"));
                a = e.extend({
                    top: b,
                    left: f,
                    width: c
                },
                v(this.opts.dropdownCss));
                this.dropdown.css(a)
            },
            shouldOpen: function() {
                var a;
                if (this.opened()) return ! 1;
                a = e.Event("open");
                this.opts.element.trigger(a);
                return ! a.isDefaultPrevented()
            },
            clearDropdownAlignmentPreference: function() {
                this.container.removeClass("select2-drop-above");
                this.dropdown.removeClass("select2-drop-above")
            },
            open: function() {
                if (!this.shouldOpen()) return ! 1;
                window.setTimeout(this.bind(this.opening), 1);
                return ! 0
            },
            opening: function() {
                var a = this.containerId,
                b = this.containerSelector,
                c = "scroll." + a,
                d = "resize." + a;
                this.container.parents().each(function() {
                    e(this).bind(c, 
                    function() {
                        var a = e(b);
                        0 == a.length && e(this).unbind(c);
                        a.select2("close")
                    })
                });
                e(window).bind(d, 
                function() {
                    var a = 
                    e(b);
                    0 == a.length && e(window).unbind(d);
                    a.select2("close")
                });
                this.clearDropdownAlignmentPreference();
                " " === this.search.val() && this.search.val("");
                this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
                this.updateResults(!0);
                this.dropdown[0] !== this.body().children().last()[0] && this.dropdown.detach().appendTo(this.body());
                this.dropdown.show();
                this.positionDropdown();
                this.dropdown.addClass("select2-drop-active");
                this.ensureHighlightVisible();
                this.focusSearch()
            },
            close: function() {
                if (this.opened()) {
                    var a = 
                    this;
                    this.container.parents().each(function() {
                        e(this).unbind("scroll." + a.containerId)
                    });
                    e(window).unbind("resize." + this.containerId);
                    this.clearDropdownAlignmentPreference();
                    this.dropdown.hide();
                    this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
                    this.results.empty();
                    this.clearSearch();
                    this.opts.element.trigger(e.Event("close"))
                }
            },
            clearSearch: function() {},
            ensureHighlightVisible: function() {
                var a = this.results,
                b,
                c,
                d,
                f;
                c = this.highlight();
                0 > c || (0 == c ? a.scrollTop(0) : 
                (b = a.find(".select2-result-selectable"), d = e(b[c]), f = d.offset().top + d.outerHeight(), c === b.length - 1 && (b = a.find("li.select2-more-results"), 0 < b.length && (f = b.offset().top + b.outerHeight())), b = a.offset().top + a.outerHeight(), f > b && a.scrollTop(a.scrollTop() + (f - b)), d = d.offset().top - a.offset().top, 0 > d && a.scrollTop(a.scrollTop() + d)))
            },
            moveHighlight: function(a) {
                for (var b = this.results.find(".select2-result-selectable"), c = this.highlight(); - 1 < c && c < b.length;) {
                    var c = c + a,
                    d = e(b[c]);
                    if (d.hasClass("select2-result-selectable") && 
                    !d.hasClass("select2-disabled")) {
                        this.highlight(c);
                        break
                    }
                }
            },
            highlight: function(a) {
                var b = this.results.find(".select2-result-selectable").not(".select2-disabled");
                if (0 === arguments.length) return i(b.filter(".select2-highlighted")[0], b.get());
                a >= b.length && (a = b.length - 1);
                0 > a && (a = 0);
                b.removeClass("select2-highlighted");
                e(b[a]).addClass("select2-highlighted");
                this.ensureHighlightVisible()
            },
            countSelectableResults: function() {
                return this.results.find(".select2-result-selectable").not(".select2-disabled").length
            },
            highlightUnderEvent: function(a) {
                a = e(a.target).closest(".select2-result-selectable");
                if (0 < a.length && !a.is(".select2-highlighted")) {
                    var b = this.results.find(".select2-result-selectable");
                    this.highlight(b.index(a))
                } else 0 == a.length && this.results.find(".select2-highlighted").removeClass("select2-highlighted")
            },
            loadMoreIfNeeded: function() {
                var a = this.results,
                b = a.find("li.select2-more-results"),
                c,
                d = this.resultsPage + 1,
                e = this,
                f = this.search.val(),
                g = this.context;
                0 !== b.length && (c = b.offset().top - a.offset().top - 
                a.height(), 0 >= c && (b.addClass("select2-active"), this.opts.query({
                    term: f,
                    page: d,
                    context: g,
                    matcher: this.opts.matcher,
                    callback: this.bind(function(c) {
                        e.opened() && (e.opts.populateResults.call(this, a, c.results, {
                            term: f,
                            page: d,
                            context: g
                        }), !0 === c.more ? (b.detach().appendTo(a).text(e.opts.formatLoadMore(d + 1)), window.setTimeout(function() {
                            e.loadMoreIfNeeded()
                        },
                        10)) : b.remove(), e.positionDropdown(), e.resultsPage = d)
                    })
                })))
            },
            tokenize: function() {},
            updateResults: function(a) {
                function b() {
                    f.scrollTop(0);
                    d.removeClass("select2-active");
                    k.positionDropdown()
                }
                function c(a) {
                    f.html(k.opts.escapeMarkup(a));
                    b()
                }
                var d = this.search,
                f = this.results,
                h = this.opts,
                i,
                k = this;
                if (! (!0 !== a && (!1 === this.showSearchInput || !this.opened()))) {
                    d.addClass("select2-active");
                    if (1 <= h.maximumSelectionSize && (i = this.data(), e.isArray(i) && i.length >= h.maximumSelectionSize && u(h.formatSelectionTooBig, "formatSelectionTooBig"))) {
                        c("<li class='select2-selection-limit'>" + h.formatSelectionTooBig(h.maximumSelectionSize) + "</li>");
                        return
                    }
                    d.val().length < h.minimumInputLength && u(h.formatInputTooShort, 
                    "formatInputTooShort") ? c("<li class='select2-no-results'>" + h.formatInputTooShort(d.val(), h.minimumInputLength) + "</li>") : (c("<li class='select2-searching'>" + h.formatSearching() + "</li>"), i = this.tokenize(), i != g && null != i && d.val(i), this.resultsPage = 1, h.query({
                        term: d.val(),
                        page: this.resultsPage,
                        context: null,
                        matcher: h.matcher,
                        callback: this.bind(function(i) {
                            var l;
                            this.opened() && ((this.context = i.context === g ? null: i.context, this.opts.createSearchChoice && "" !== d.val() && (l = this.opts.createSearchChoice.call(null, 
                            d.val(), i.results), l !== g && null !== l && k.id(l) !== g && null !== k.id(l) && 0 === e(i.results).filter(function() {
                                return m(k.id(this), k.id(l))
                            }).length && i.results.unshift(l)), 0 === i.results.length && u(h.formatNoMatches, "formatNoMatches")) ? c("<li class='select2-no-results'>" + h.formatNoMatches(d.val()) + "</li>") : (f.empty(), k.opts.populateResults.call(this, f, i.results, {
                                term: d.val(),
                                page: this.resultsPage,
                                context: null
                            }), !0 === i.more && u(h.formatLoadMore, "formatLoadMore") && (f.append("<li class='select2-more-results'>" + k.opts.escapeMarkup(h.formatLoadMore(this.resultsPage)) + 
                            "</li>"), window.setTimeout(function() {
                                k.loadMoreIfNeeded()
                            },
                            10)), this.postprocessResults(i, a), b()))
                        })
                    }))
                }
            },
            cancel: function() {
                this.close()
            },
            blur: function() {
                this.close();
                this.container.removeClass("select2-container-active");
                this.dropdown.removeClass("select2-drop-active");
                this.search[0] === document.activeElement && this.search.blur();
                this.clearSearch();
                this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")
            },
            focusSearch: function() {
                this.search.show();
                this.search.focus();
                window.setTimeout(this.bind(function() {
                    this.search.show();
                    this.search.focus();
                    this.search.val(this.search.val())
                }), 10)
            },
            selectHighlighted: function() {
                var a = this.highlight(),
                b = this.results.find(".select2-highlighted").not(".select2-disabled"),
                c = b.closest(".select2-result-selectable").data("select2-data");
                c && (b.addClass("select2-disabled"), this.highlight(a), this.onSelect(c))
            },
            getPlaceholder: function() {
                return this.opts.element.attr("placeholder") || this.opts.element.attr("data-placeholder") || this.opts.element.data("placeholder") || 
                this.opts.placeholder
            },
            initContainerWidth: function() {
                var a = function() {
                    var a,
                    c,
                    d,
                    f;
                    if ("off" === this.opts.width) return null;
                    if ("element" === this.opts.width) return 0 === this.opts.element.outerWidth() ? "auto": this.opts.element.outerWidth() + "px";
                    if ("copy" === this.opts.width || "resolve" === this.opts.width) {
                        a = this.opts.element.attr("style");
                        if (a !== g) {
                            a = a.split(";");
                            d = 0;
                            for (f = a.length; d < f; d += 1) if (c = a[d].replace(/\s/g, "").match(/width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/), null !== c && 1 <= c.length) return c[1]
                        }
                        return "resolve" === 
                        this.opts.width ? (a = this.opts.element.css("width"), 0 < a.indexOf("%") ? a: 0 === this.opts.element.outerWidth() ? "auto": this.opts.element.outerWidth() + "px") : null
                    }
                    return e.isFunction(this.opts.width) ? this.opts.width() : this.opts.width
                }.call(this);
                null !== a && this.container.attr("style", "width: " + a)
            }
        });
        y = x(w, {
            createContainer: function() {
                return e("<div></div>", {
                    "class": "select2-container"
                }).html("    <a href='#' onclick='return false;' class='select2-choice'>   <span></span><abbr class='select2-search-choice-close' style='display:none;'></abbr>   <div><b></b></div></a>    <div class='select2-drop select2-offscreen'>   <div class='select2-search'>       <input type='text' autocomplete='off' class='select2-input'/>   </div>   <ul class='select2-results'>   </ul></div>")
            },
            opening: function() {
                this.search.show();
                this.parent.opening.apply(this, arguments);
                this.dropdown.removeClass("select2-offscreen")
            },
            close: function() {
                this.opened() && (this.parent.close.apply(this, arguments), this.dropdown.removeAttr("style").addClass("select2-offscreen").insertAfter(this.selection).show())
            },
            focus: function() {
                this.close();
                this.selection.focus()
            },
            isFocused: function() {
                return this.selection[0] === document.activeElement
            },
            cancel: function() {
                this.parent.cancel.apply(this, arguments);
                this.selection.focus()
            },
            initContainer: function() {
                var a,
                b = this.dropdown;
                this.selection = a = this.container.find(".select2-choice");
                this.search.bind("keydown", this.bind(function(a) {
                    if (this.enabled) if (a.which === f.PAGE_UP || a.which === f.PAGE_DOWN) l(a);
                    else if (this.opened()) switch (a.which) {
                    case f.UP:
                    case f.DOWN:
                        this.moveHighlight(a.which === f.UP ? -1: 1);
                        l(a);
                        break;
                    case f.TAB:
                    case f.ENTER:
                        this.selectHighlighted();
                        l(a);
                        break;
                    case f.ESC:
                        this.cancel(a),
                        l(a)
                    } else a.which === f.TAB || f.isControl(a) || f.isFunctionKey(a) || a.which === f.ESC || !1 === 
                    this.opts.openOnEnter && a.which === f.ENTER || this.open()
                }));
                this.search.bind("focus", this.bind(function() {
                    this.selection.attr("tabIndex", "-1")
                }));
                this.search.bind("blur", this.bind(function() {
                    this.opened() || this.container.removeClass("select2-container-active");
                    window.setTimeout(this.bind(function() {
                        this.selection.attr("tabIndex", this.opts.element.attr("tabIndex"))
                    }), 10)
                }));
                a.bind("mousedown", this.bind(function() {
                    this.opened() ? (this.close(), this.selection.focus()) : this.enabled && this.open()
                }));
                b.bind("mousedown", 
                this.bind(function() {
                    this.search.focus()
                }));
                a.bind("focus", this.bind(function() {
                    this.container.addClass("select2-container-active");
                    this.search.attr("tabIndex", "-1")
                }));
                a.bind("blur", this.bind(function() {
                    this.opened() || this.container.removeClass("select2-container-active");
                    window.setTimeout(this.bind(function() {
                        this.search.attr("tabIndex", this.opts.element.attr("tabIndex"))
                    }), 10)
                }));
                a.bind("keydown", this.bind(function(a) {
                    if (this.enabled) if (a.which === f.PAGE_UP || a.which === f.PAGE_DOWN) l(a);
                    else if (! (a.which === 
                    f.TAB || f.isControl(a) || f.isFunctionKey(a) || a.which === f.ESC) && !(!1 === this.opts.openOnEnter && a.which === f.ENTER)) if (a.which == f.DELETE) this.opts.allowClear && this.clear();
                    else {
                        this.open();
                        if (a.which !== f.ENTER && !(48 > a.which)) {
                            var b = String.fromCharCode(a.which).toLowerCase();
                            a.shiftKey && (b = b.toUpperCase());
                            this.search.focus();
                            this.search.val(b)
                        }
                        l(a)
                    }
                }));
                a.delegate("abbr", "mousedown", this.bind(function(a) {
                    this.enabled && (this.clear(), l(a), this.close(), this.triggerChange(), this.selection.focus())
                }));
                this.setPlaceholder();
                this.search.bind("focus", this.bind(function() {
                    this.container.addClass("select2-container-active")
                }))
            },
            clear: function() {
                this.opts.element.val("");
                this.selection.find("span").empty();
                this.selection.removeData("select2-data");
                this.setPlaceholder()
            },
            initSelection: function() {
                if ("" === this.opts.element.val()) this.close(),
                this.setPlaceholder();
                else {
                    var a = this;
                    this.opts.initSelection.call(null, this.opts.element, 
                    function(b) {
                        b !== g && null !== b && (a.updateSelection(b), a.close(), a.setPlaceholder())
                    })
                }
            },
            prepareOpts: function() {
                var a = 
                this.parent.prepareOpts.apply(this, arguments);
                "select" === a.element.get(0).tagName.toLowerCase() && (a.initSelection = function(a, c) {
                    var d = a.find(":selected");
                    e.isFunction(c) && c({
                        id: d.attr("value"),
                        text: d.text()
                    })
                });
                return a
            },
            setPlaceholder: function() {
                var a = this.getPlaceholder();
                "" === this.opts.element.val() && a !== g && !(this.select && "" !== this.select.find("option:first").text()) && (this.selection.find("span").html(this.opts.escapeMarkup(a)), this.selection.addClass("select2-default"), this.selection.find("abbr").hide())
            },
            postprocessResults: function(a, b) {
                var c = 0,
                d = this,
                f = !0;
                this.results.find(".select2-result-selectable").each2(function(a, b) {
                    if (m(d.id(b.data("select2-data")), d.opts.element.val())) return c = a,
                    !1
                });
                this.highlight(c); ! 0 === b && (f = this.showSearchInput = F(a.results) >= this.opts.minimumResultsForSearch, this.dropdown.find(".select2-search")[f ? "removeClass": "addClass"]("select2-search-hidden"), e(this.dropdown, this.container)[f ? "addClass": "removeClass"]("select2-with-searchbox"))
            },
            onSelect: function(a) {
                var b = this.opts.element.val();
                this.opts.element.val(this.id(a));
                this.updateSelection(a);
                this.close();
                this.selection.focus();
                m(b, this.id(a)) || this.triggerChange()
            },
            updateSelection: function(a) {
                var b = this.selection.find("span");
                this.selection.data("select2-data", a);
                b.empty();
                a = this.opts.formatSelection(a, b);
                a !== g && b.append(this.opts.escapeMarkup(a));
                this.selection.removeClass("select2-default");
                this.opts.allowClear && this.getPlaceholder() !== g && this.selection.find("abbr").show()
            },
            val: function() {
                var a,
                b = null,
                c = this;
                if (0 === arguments.length) return this.opts.element.val();
                a = arguments[0];
                if (this.select) this.select.val(a).find(":selected").each2(function(a, c) {
                    b = {
                        id: c.attr("value"),
                        text: c.text()
                    };
                    return ! 1
                }),
                this.updateSelection(b),
                this.setPlaceholder();
                else {
                    if (this.opts.initSelection === g) throw Error("cannot call val() if initSelection() is not defined");
                    a ? (this.opts.element.val(a), this.opts.initSelection(this.opts.element, 
                    function(a) {
                        c.opts.element.val(!a ? "": c.id(a));
                        c.updateSelection(a);
                        c.setPlaceholder()
                    })) : this.clear()
                }
            },
            clearSearch: function() {
                this.search.val("")
            },
            data: function(a) {
                var b;
                if (0 === arguments.length) return b = this.selection.data("select2-data"),
                b == g && (b = null),
                b; ! a || "" === a ? this.clear() : (this.opts.element.val(!a ? "": this.id(a)), this.updateSelection(a))
            }
        });
        z = x(w, {
            createContainer: function() {
                return e("<div></div>", {
                    "class": "select2-container select2-container-multi"
                }).html("    <ul class='select2-choices'>  <li class='select2-search-field'>    <input type='text' autocomplete='off' class='select2-input'>  </li></ul><div class='select2-drop select2-drop-multi' style='display:none;'>   <ul class='select2-results'>   </ul></div>")
            },
            prepareOpts: function() {
                var a = this.parent.prepareOpts.apply(this, arguments);
                "select" === a.element.get(0).tagName.toLowerCase() && (a.initSelection = function(a, c) {
                    var d = [];
                    a.find(":selected").each2(function(a, b) {
                        d.push({
                            id: b.attr("value"),
                            text: b.text()
                        })
                    });
                    e.isFunction(c) && c(d)
                });
                return a
            },
            initContainer: function() {
                var a;
                this.searchContainer = this.container.find(".select2-search-field");
                this.selection = a = this.container.find(".select2-choices");
                this.search.bind("keydown", this.bind(function(b) {
                    if (this.enabled) {
                        if (b.which === 
                        f.BACKSPACE && "" === this.search.val()) {
                            this.close();
                            var c;
                            c = a.find(".select2-search-choice-focus");
                            if (0 < c.length) {
                                this.unselect(c.first());
                                this.search.width(10);
                                l(b);
                                return
                            }
                            c = a.find(".select2-search-choice");
                            0 < c.length && c.last().addClass("select2-search-choice-focus")
                        } else a.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
                        if (this.opened()) switch (b.which) {
                        case f.UP:
                        case f.DOWN:
                            this.moveHighlight(b.which === f.UP ? -1: 1);
                            l(b);
                            return;
                        case f.ENTER:
                        case f.TAB:
                            this.selectHighlighted();
                            l(b);
                            return;
                        case f.ESC:
                            this.cancel(b);
                            l(b);
                            return
                        }
                        if (! (b.which === f.TAB || f.isControl(b) || f.isFunctionKey(b) || b.which === f.BACKSPACE || b.which === f.ESC) && !(!1 === this.opts.openOnEnter && b.which === f.ENTER)) this.open(),
                        (b.which === f.PAGE_UP || b.which === f.PAGE_DOWN) && l(b)
                    }
                }));
                this.search.bind("keyup", this.bind(this.resizeSearch));
                this.search.bind("blur", this.bind(function(a) {
                    this.container.removeClass("select2-container-active");
                    this.search.removeClass("select2-focused");
                    this.clearSearch();
                    a.stopImmediatePropagation()
                }));
                this.container.delegate(".select2-choices", "mousedown", this.bind(function(a) {
                    this.enabled && !(0 < e(a.target).closest(".select2-search-choice").length) && (this.clearPlaceholder(), this.open(), this.focusSearch(), a.preventDefault())
                }));
                this.container.delegate(".select2-choices", "focus", this.bind(function() {
                    this.enabled && (this.container.addClass("select2-container-active"), this.dropdown.addClass("select2-drop-active"), this.clearPlaceholder())
                }));
                this.clearSearch()
            },
            enable: function() {
                this.enabled || (this.parent.enable.apply(this, 
                arguments), this.search.removeAttr("disabled"))
            },
            disable: function() {
                this.enabled && (this.parent.disable.apply(this, arguments), this.search.attr("disabled", !0))
            },
            initSelection: function() {
                "" === this.opts.element.val() && (this.updateSelection([]), this.close(), this.clearSearch());
                if (this.select || "" !== this.opts.element.val()) {
                    var a = this;
                    this.opts.initSelection.call(null, this.opts.element, 
                    function(b) {
                        if (b !== g && b !== null) {
                            a.updateSelection(b);
                            a.close();
                            a.clearSearch()
                        }
                    })
                }
            },
            clearSearch: function() {
                var a = this.getPlaceholder();
                a !== g && 0 === this.getVal().length && !1 === this.search.hasClass("select2-focused") ? (this.search.val(a).addClass("select2-default"), this.resizeSearch()) : this.search.val(" ").width(10)
            },
            clearPlaceholder: function() {
                this.search.hasClass("select2-default") ? this.search.val("").removeClass("select2-default") : " " === this.search.val() && this.search.val("")
            },
            opening: function() {
                this.parent.opening.apply(this, arguments);
                this.clearPlaceholder();
                this.resizeSearch();
                this.focusSearch()
            },
            close: function() {
                this.opened() && 
                this.parent.close.apply(this, arguments)
            },
            focus: function() {
                this.close();
                this.search.focus()
            },
            isFocused: function() {
                return this.search.hasClass("select2-focused")
            },
            updateSelection: function(a) {
                var b = [],
                c = [],
                d = this;
                e(a).each(function() {
                    0 > i(d.id(this), b) && (b.push(d.id(this)), c.push(this))
                });
                a = c;
                this.selection.find(".select2-search-choice").remove();
                e(a).each(function() {
                    d.addSelectedChoice(this)
                });
                d.postprocessResults()
            },
            tokenize: function() {
                var a = this.search.val(),
                a = this.opts.tokenizer(a, this.data(), this.bind(this.onSelect), 
                this.opts);
                null != a && a != g && (this.search.val(a), 0 < a.length && this.open())
            },
            onSelect: function(a) {
                this.addSelectedChoice(a);
                this.select && this.postprocessResults();
                this.opts.closeOnSelect ? (this.close(), this.search.width(10)) : 0 < this.countSelectableResults() ? (this.search.width(10), this.resizeSearch(), this.positionDropdown()) : this.close();
                this.triggerChange({
                    added: a
                });
                this.focusSearch()
            },
            cancel: function() {
                this.close();
                this.focusSearch()
            },
            addSelectedChoice: function(a) {
                var b = e("<li class='select2-search-choice'>    <div></div>    <a href='#' onclick='return false;' class='select2-search-choice-close' tabindex='-1'></a></li>"),
                c = this.id(a),
                d = this.getVal(),
                f;
                f = this.opts.formatSelection(a, b);
                b.find("div").replaceWith("<div>" + this.opts.escapeMarkup(f) + "</div>");
                b.find(".select2-search-choice-close").bind("mousedown", l).bind("click dblclick", this.bind(function(a) {
                    this.enabled && (e(a.target).closest(".select2-search-choice").fadeOut("fast", this.bind(function() {
                        this.unselect(e(a.target));
                        this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
                        this.close();
                        this.focusSearch()
                    })).dequeue(), 
                    l(a))
                })).bind("focus", this.bind(function() {
                    this.enabled && (this.container.addClass("select2-container-active"), this.dropdown.addClass("select2-drop-active"))
                }));
                b.data("select2-data", a);
                b.insertBefore(this.searchContainer);
                d.push(c);
                this.setVal(d)
            },
            unselect: function(a) {
                var b = this.getVal(),
                c,
                d,
                a = a.closest(".select2-search-choice");
                if (0 === a.length) throw "Invalid argument: " + a + ". Must be .select2-search-choice";
                c = a.data("select2-data");
                d = i(this.id(c), b);
                0 <= d && (b.splice(d, 1), this.setVal(b), this.select && 
                this.postprocessResults());
                a.remove();
                this.triggerChange({
                    removed: c
                })
            },
            postprocessResults: function() {
                var a = this.getVal(),
                b = this.results.find(".select2-result-selectable"),
                c = this.results.find(".select2-result-with-children"),
                d = this;
                b.each2(function(b, c) {
                    var e = d.id(c.data("select2-data"));
                    0 <= i(e, a) ? c.addClass("select2-disabled").removeClass("select2-result-selectable") : c.removeClass("select2-disabled").addClass("select2-result-selectable")
                });
                c.each2(function(a, b) {
                    0 == b.find(".select2-result-selectable").length ? 
                    b.addClass("select2-disabled") : b.removeClass("select2-disabled")
                });
                b.each2(function(a, b) {
                    if (!b.hasClass("select2-disabled") && b.hasClass("select2-result-selectable")) return d.highlight(0),
                    !1
                })
            },
            resizeSearch: function() {
                var a,
                b,
                c,
                d,
                f = this.search.outerWidth() - this.search.width();
                a = this.search;
                q || (c = a[0].currentStyle || window.getComputedStyle(a[0], null), q = e("<div></div>").css({
                    position: "absolute",
                    left: "-10000px",
                    top: "-10000px",
                    display: "none",
                    fontSize: c.fontSize,
                    fontFamily: c.fontFamily,
                    fontStyle: c.fontStyle,
                    fontWeight: c.fontWeight,
                    letterSpacing: c.letterSpacing,
                    textTransform: c.textTransform,
                    whiteSpace: "nowrap"
                }), e("body").append(q));
                q.text(a.val());
                a = q.width() + 10;
                b = this.search.offset().left;
                c = this.selection.width();
                d = this.selection.offset().left;
                b = c - (b - d) - f;
                b < a && (b = c - f);
                40 > b && (b = c - f);
                this.search.width(b)
            },
            getVal: function() {
                var a;
                if (this.select) return a = this.select.val(),
                null === a ? [] : a;
                a = this.opts.element.val();
                return s(a, this.opts.separator)
            },
            setVal: function(a) {
                var b;
                this.select ? this.select.val(a) : (b = 
                [], e(a).each(function() {
                    0 > i(this, b) && b.push(this)
                }), this.opts.element.val(0 === b.length ? "": b.join(this.opts.separator)))
            },
            val: function() {
                var a,
                b = [],
                c = this;
                if (0 === arguments.length) return this.getVal();
                if (a = arguments[0]) if (this.setVal(a), this.select) this.select.find(":selected").each(function() {
                    b.push({
                        id: e(this).attr("value"),
                        text: e(this).text()
                    })
                }),
                this.updateSelection(b);
                else {
                    if (this.opts.initSelection === g) throw Error("val() cannot be called if initSelection() is not defined");
                    this.opts.initSelection(this.opts.element, 
                    function(a) {
                        var b = e(a).map(c.id);
                        c.setVal(b);
                        c.updateSelection(a);
                        c.clearSearch()
                    })
                } else this.opts.element.val(""),
                this.updateSelection([]);
                this.clearSearch()
            },
            onSortStart: function() {
                if (this.select) throw Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
                this.search.width(0);
                this.searchContainer.hide()
            },
            onSortEnd: function() {
                var a = [],
                b = this;
                this.searchContainer.show();
                this.searchContainer.appendTo(this.searchContainer.parent());
                this.resizeSearch();
                this.selection.find(".select2-search-choice").each(function() {
                    a.push(b.opts.id(e(this).data("select2-data")))
                });
                this.setVal(a);
                this.triggerChange()
            },
            data: function(a) {
                var b = this,
                c;
                if (0 === arguments.length) return this.selection.find(".select2-search-choice").map(function() {
                    return e(this).data("select2-data")
                }).get();
                a || (a = []);
                c = e.map(a, 
                function(a) {
                    return b.opts.id(a)
                });
                this.setVal(c);
                this.updateSelection(a);
                this.clearSearch()
            }
        });
        e.fn.select2 = function() {
            var a = Array.prototype.slice.call(arguments, 0),
            b,
            c,
            d,
            f,
            h = "val destroy opened open close focus isFocused container onSortStart onSortEnd enable disable positionDropdown data".split(" ");
            this.each(function() {
                if (0 === a.length || "object" === typeof a[0]) b = 0 === a.length ? {}: e.extend({},
                a[0]),
                b.element = e(this),
                "select" === b.element.get(0).tagName.toLowerCase() ? f = b.element.attr("multiple") : (f = b.multiple || !1, "tags" in b && (b.multiple = f = !0)),
                c = f ? new z: new y,
                c.init(b);
                else if ("string" === typeof a[0]) {
                    if (0 > i(a[0], h)) throw "Unknown method: " + a[0];
                    d = g;
                    c = e(this).data("select2");
                    if (c !== g && (d = "container" === a[0] ? c.container: c[a[0]].apply(c, a.slice(1)), d !== g)) return ! 1
                } else throw "Invalid arguments to select2 plugin: " + a;
            });
            return d === g ? this: d
        };
        e.fn.select2.defaults = {
            width: "copy",
            closeOnSelect: !0,
            openOnEnter: !0,
            containerCss: {},
            dropdownCss: {},
            containerCssClass: "",
            dropdownCssClass: "",
            formatResult: function(a, b, c) {
                b = [];
                B(a.text, c.term, b);
                return b.join("")
            },
            formatSelection: function(a) {
                return a ? a.text: g
            },
            formatResultCssClass: function() {
                return g
            },
            formatNoMatches: function() {
                return "No matches found"
            },
            formatInputTooShort: function(a, b) {
                return "Please enter " + (b - a.length) + " more characters"
            },
            formatSelectionTooBig: function(a) {
                return "You can only select " + a + " item" + (1 == a ? "": "s")
            },
            formatLoadMore: function() {
                return "Loading more results..."
            },
            formatSearching: function() {
                return "Searching..."
            },
            minimumResultsForSearch: 0,
            minimumInputLength: 0,
            maximumSelectionSize: 0,
            id: function(a) {
                return a.id
            },
            matcher: function(a, b) {
                return 0 <= b.toUpperCase().indexOf(a.toUpperCase())
            },
            separator: ",",
            tokenSeparators: [],
            tokenizer: H,
            escapeMarkup: function(a) {
                return a && "string" === typeof a ? a.replace(/&/g, "&amp;") : a
            },
            blurOnChange: !1
        };
        window.Select2 = {
            query: {
                ajax: C,
                local: D,
                tags: E
            },
            util: {
                debounce: A,
                markMatch: B
            },
            "class": {
                "abstract": w,
                single: y,
                multi: z
            }
        }
    }
})(jQuery);